事件(Event)是一種特殊的機制,用於記錄智能合約中的重要狀態變化或操作。事件是以太坊區塊鏈上的一種日誌抽象,具有以下兩個主要特點。
應用程序可以通過以太坊的 RPC 接口訂閱和監聽事件,從而及時響應智能合約中的狀態變化。
與鏈上存儲數據相比,事件是一種更經濟的方式來存儲和傳遞信息,因為每個事件日誌記錄約耗費 2000 Gas,而鏈上存儲一個新變數至少需要 20000 Gas。
要聲明一個事件,你需要使用 event 關鍵字,然後指定事件的名稱和事件參數,包括參數的類型和名稱。
事件通常在智能合約的函數內部被觸發(emitted)。
以太坊虛擬機日誌(Log)
在以太坊虛擬機(EVM)中,事件的日誌記錄以日誌(Log)的形式存儲。每個事件日誌記錄都包括兩個部分。
事件日誌的第一部分是主題數組,用於描述事件。主題數組的長度不能超過 4。其中,第一個元素是事件的簽名(哈希)。
此外,主題中還可以包含最多 3 個帶有 indexed 標記的參數。這些參數可以理解為事件的索引 "鍵",方便之後進行搜索。每個帶有 indexed 標記的參數大小固定為 256bit(32byte),如果參數過大,則會自動計算哈希值並存儲在主題中。
事件中不帶 indexed 標記的參數會被存儲在數據(data)中。數據可以理解為事件的 "值",這些參數不能直接檢索,但可以存儲任意大小的數據。因此,數據通常用於存儲複雜的數據結構,如數組和字符串等,因為這些數據超過 256bit,即使存儲在事件的主題中,也會以哈希的方式存儲。此外,相比於主題,數據的存儲成本較低
WTF Solidity Event
keccak256 online
Etherscan